上次介紹了MONGODB的使用,今天來介紹如何把感測器讀到的資料上傳至資料庫
我們在DAY12有教說把資料包成JSON格式,所以我們arduino傳回來的資料就已經是包好的了
但直接的JSON格式他不吃,所以我們要把KEY跟VALUE抽出來
Arduno_data = JSON.parse(line);
Sensor_data = Object.values(Arduno_data)
Sensor_key = Object.keys(Arduno_data)
這樣會幫你把KEY跟VALUE轉成陣列 ,之後再做插入資料的時候就只要使用陣列的長度做迴圈
for(var i=0 ; i<Sensor_key.length;i++){
db_client.collection('data',function(err,collection){
collection.insertOne({ name:Sensor_key[i], data:Sensor_data[i] });
if(i == Sensor_key.length-1 ){
collection.countDocuments(function(err,count){
if(err) throw err;
console.log('Total Rows:'+count);
});
}
});
}
這樣子就能夠把包好的資料一筆一筆的插入資料庫
雖然把資料輸入進去了 但是我們不知道這資料是什麼日期插入的所以要去幫資料新增一筆時間的欄位
這時就要介紹date函數
parser.on('data', line =>{
let udate = new Date();
let nowtime = udate.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
大家看到這個會有個疑惑 不是只有Date函數嗎 怎麼多了一個localeString呢
那是因為Date讀取到的 是UTC+0的時間 會跟我們少八小時 所以我們改用本地的方式 直接去抓TimeZone
這時整個Mongodb的程式就會變這樣
parser.on('data', line =>{
let udate = new Date();
let nowtime = udate.toLocaleString('zh-hant', { timeZone: 'Asia/Taipei' })
console.log(line)
Arduno_data = JSON.parse(line);
Sensor_data = Object.values(Arduno_data)
Sensor_key = Object.keys(Arduno_data)
client.publish('arduino_data', line)
MongoClient.connect("mongodb://127.0.0.1:27017/test",function(err,client){
if(err){
console.log(err);
console.log('connecting fail');
return;
}
console.log('connecting');
var db_client = client.db('data_test')
var db_table = db_client.collection('data')
console.log('connection success')
for(var i=0 ; i<Sensor_key.length;i++){
db_client.collection('data',function(err,collection){
collection.insertOne({ time:nowtime, name:Sensor_key[i], data:Sensor_data[i] });
if(i == Sensor_key.length-1 ){
collection.countDocuments(function(err,count){
if(err) throw err;
console.log('Total Rows:'+count);
});
collection.find({time:nowtime}).toArray(function(err,items){
if(err) throw err;
console.log(items);
console.log("DATA FOUND");
});
}
});
}
})
})
執行結果:
把資料存進資料庫後呢 之後就可以將資料做分析 做二氧化碳折線圖之類的 不過我們主旨不是資料分析 所以先不講這一塊
明天呢 會來開始講我們主角 樹梅派 一個便宜的單板電腦